contents

슈퍼 클래스, 추상 클래스, 인터페이스의 차이점을 정리해보겠습니다.


구분 슈퍼 클래스 (Super Class) 추상 클래스 (Abstract Class) 인터페이스 (Interface)
개념 다른 클래스가 상속받는 일반 클래스 하나 이상의 추상 메서드를 포함할 수 있는 클래스 구현되지 않은 메서드(추상 메서드)만 가질 수 있는 일종의 규격
인스턴스 생성 가능 여부 가능 직접 인스턴스 생성 불가 (자식 클래스에서 구현 필요) 직접 인스턴스 생성 불가 (구현 클래스 필요)
메서드 구현 모든 메서드 구현 가능 일반 메서드와 추상 메서드 모두 포함 가능 Java 8 이상부터는 default·static 메서드 구현 가능, 기본은 추상 메서드
변수 모든 변수 선언 가능 모든 변수 선언 가능 상수(public static final)만 선언 가능
상속 규칙 단일 상속 단일 상속 가능 다중 구현 가능
목적 공통 속성과 동작의 재사용 공통 기능 일부 구현과 하위 클래스에서의 확장 강제 클래스가 특정 역할을 수행하도록 메서드 구현 강제
사용 예 기능이 일부 구현된 일반 클래스 템플릿 메서드 패턴 등에 자주 사용 다중 행위를 대체하는 역할, 콜백, API 규약 정의
접근 제한자 자유롭게 사용 가능 자유롭게 사용 가능 모든 메서드는 기본적으로 public
상속 관계 표현 IS-A 관계 IS-A 관계 역할(능력) 명세

간단 설명


예시

// 슈퍼 클래스
class Animal {
    void eat() { System.out.println("먹는다"); }
}

// 추상 클래스
abstract class Bird {
    void fly() { System.out.println("날다"); }
    abstract void sing();
}

// 인터페이스
interface Swimmable {
    void swim();
}

// 구현 예
class Sparrow extends Bird {
    void sing() { System.out.println("짹짹"); }
}

class Fish implements Swimmable {
    public void swim() { System.out.println("헤엄치다"); }
}

각 개념(슈퍼 클래스, 추상 클래스, 인터페이스)의 장단점, 쓰임새, 그리고 객체지향 설계에서 선택 기준을 아래와 같이 정리합니다.


1. 슈퍼 클래스(Super Class, 일반 클래스 상속)

장점

단점

쓰임새


2. 추상 클래스(Abstract Class)

장점

단점

쓰임새


3. 인터페이스(Interface)

장점

단점

쓰임새


4. 객체지향 설계 원칙에 따른 선택 기준

설계 상황 추천 개념 이유와 설명
'is-a' 관계로 완전한 확장, 코드 재사용 슈퍼 클래스/추상 클래스 계층 구조 설계에 적합, 공통 동작·상태 물려주기, 기본 기능 추가 확장 용이
공통 행위 규약(동작만 강제), 다중 역할 인터페이스 다양한 행동·기능 조합 필수, 다중 구현으로 유연·확장성 갖춤, 약한 결합으로 유지보수 쉬움
공통 동작 기본 로직+핵심부분만 다양 추상 클래스 템플릿 메서드 패턴 등, 공통 기능 제공+구현 강제 구조
여러 역할 동시 수행(예: 개가 동물이면서도 Swimmable) 인터페이스+상속 혼용 다양한 역할 합성 가능, 다양한 시스템과의 통합에 적합
상태·데이터 반드시 필요(필드/생성자) 슈퍼/추상 클래스 필드, 생성자 로직 등 구현 및 확장 필요

결론


현실적인 사례에 각 개념(슈퍼 클래스, 추상 클래스, 인터페이스)을 어떻게 적용하는지 구체적인 상황별 예제와 시나리오를 통해 설명하겠습니다.


1. 슈퍼 클래스 (Super Class)

예제 시나리오: 동물원 프로그램

// 슈퍼 클래스 정의
class Animal {
    String name;
    int age;

    void eat() {
        System.out.println(name + "가 먹는다.");
    }
}

// 하위 클래스
class Lion extends Animal {
    void roar() {
        System.out.println(name + "가 으르렁!");
    }
}

// 사용
Lion leo = new Lion();
leo.name = "Leo";
leo.eat();    // Leo가 먹는다.
leo.roar();   // Leo가 으르렁!

상황: 여러 동물의 공통 속성과 동작을 코드 중복 없이 상속으로 재사용.


2. 추상 클래스 (Abstract Class)

예제 시나리오: 결제 시스템의 다양한 결제수단

abstract class PaymentMethod {
    void showHistory() { System.out.println("거래내역 조회"); }
    abstract boolean pay(int amount); // 공통 인터페이스, 구현은 각 방식별 다름
}

class CreditCard extends PaymentMethod {
    boolean pay(int amount) {
        System.out.println("신용카드 결제 " + amount);
        return true;
    }
}
class BankTransfer extends PaymentMethod {
    boolean pay(int amount) {
        System.out.println("계좌이체 결제 " + amount);
        return true;
    }
}

// 사용
PaymentMethod pm = new CreditCard();
pm.showHistory();
pm.pay(10000);

상황: 결제 방식마다 차별화된 동작이 필요하지만, 공통 책임(내역 조회)은 상위에서 구현.


3. 인터페이스 (Interface)

예제 시나리오: 스마트홈 제어 시스템

interface PowerSwitchable {
    void turnOn();
    void turnOff();
}

class Light implements PowerSwitchable {
    public void turnOn() { System.out.println("조명 켜기"); }
    public void turnOff() { System.out.println("조명 끄기"); }
}
class TV implements PowerSwitchable {
    public void turnOn() { System.out.println("TV 켜기"); }
    public void turnOff() { System.out.println("TV 끄기"); }
}

PowerSwitchable device = new Light();
device.turnOn();  // 조명 켜기
device = new TV();
device.turnOff(); // TV 끄기

상황: 각 클래스가 여러 인터페이스를 동시에 구현할 수 있고, 다양한 객체에 일관된 메시지 전송.
확장: 나중에 AirConditioner 등 추가 기기도 인터페이스만 구현하면 제어 가능.


4. 복합적 예제: 다중 역할, 역할 분리

예시 - 동물이면서 수영도 하는 개

class Animal { /* ... */ }
interface Swimmable { void swim(); }

class Dog extends Animal implements Swimmable {
    public void swim() { System.out.println("개가 수영한다"); }
}

설계상 언제 무엇을 선택할까?

references